package br.com.imob.dao;

import br.com.imob.modelo.Bairro;
import br.com.imob.modelo.Estado;

import java.util.HashSet;
import java.util.List;

public class BairroDao extends GenericDao {

	public BairroDao() {
	}

	public Integer adicionarBairro(Bairro bairro) {
		// busca cidade jah cadastrada
		// bairro.setCidade(cdao.getCidadeQNamedCidade(bairro.getCidade().getCidade()));

		// O diferencial se torna o Estado
		Estado e = new EstadoDao().getEstadoQNamedUf(bairro.getCidade().getEstado().getUf());
		// Caso haja mais de um mesmo nome de cidade
		bairro.setCidade(new CidadeDao()
				.getCidadeByQuery(
						"FROM Cidade c WHERE c.cidade = ? AND c.estado = "
								+ e.getEstadoId() + " ", bairro.getCidade()
								.getCidade()));

		saveOrUpdatePojo(bairro);
		return bairro.getBairroId();
	}

	public Bairro addBairro(Bairro bairro) {
		Estado e = new EstadoDao().getEstadoQNamedUf(bairro.getCidade()
				.getEstado().getUf());
		bairro.setCidade(new CidadeDao()
				.getCidadeByQuery(
						"FROM Cidade c WHERE c.cidade = ? AND c.estado = "
								+ e.getEstadoId() + " ", bairro.getCidade()
								.getCidade()));

		saveOrUpdatePojo(bairro);
		return bairro;
	}

	public void removerBairro(Bairro bairro) {
		removerPojo(bairro);
	}

	/* Precisa definir o ID */
	public void atualizarBairro(Bairro recupera) {
		saveOrUpdatePojo(recupera);
	}

	
	/**
	 * Editar um Bairro
	 * @param String oldBairro
	 * @param String newBairro
	 */
	public void atualizarBairro(String oldBairro, String newBairro ) {
		if ( ( !"".equals(oldBairro) && oldBairro != null )
			&& ( !"".equals(newBairro) && newBairro != null ) ) 
			atualizarBairro( getBairroQNamed(oldBairro), new Bairro(newBairro) );
	}
	

	/*
	 * Precisa definir qual atribuito sera a chave a identificar a tupla a ser
	 * alterada
	 */
	public void atualizarBairro(Bairro recuperar, Bairro alterar) {
		recuperar = retriveBairro(recuperar);

		if (alterar.getBairro() != null)
			recuperar.setBairro(alterar.getBairro());
		if (alterar.getCep() != null)
			recuperar.setCep(alterar.getCep());

		saveOrUpdatePojo(recuperar);
	}

	// Artificio para Recuperar a Tupla de Bairro
	protected Bairro retriveBairro(Bairro recuperar) {
		if (recuperar.getBairroId() != null)
			return getBairro(recuperar.getBairroId());
		if (recuperar.getBairro() != null)
			return getBairroQNamed(recuperar.getBairro());
		if (recuperar.getCep() != null)
			return getBairroQNamedCep(recuperar.getCep());

		return recuperar;
	}

	// Consultas
	public Bairro getBairro(Integer key) {
		return getPojoByID(Bairro.class, key);
	}

	public Bairro getBairroByQuery(String query, Object... params) {
		return getPojoByQry(query, params);
	}

	public Bairro getBairroQNamed(String fltrBairro) {
		return getPojoByQNamed("Bairro.findByBairro", fltrBairro);
	}

	public Bairro getBairroQNamedCep(String fltrBairro) {
		return getPojoByQNamed("Bairro.findByCep", fltrBairro);
	}

	public List<Bairro> getBairros() {
		return (List<Bairro>) getALL(Bairro.class);
	}

	public List<Bairro> getBairrosQNamedPRX(String fltrBairro) {
		return getListByQNamedPRX("Bairro.findLikeByBairro", fltrBairro);
	}

	public List<Bairro> getBairrosQNamedCepPRX(String fltrCep) {
		return getListByQNamedPRX("Bairro.findLikeByCep", fltrCep);
	}

	public List<Bairro> getBairrosQNamedAllPRX(String fltrBairro, String fltrCep) {
		List<Bairro> itensBairro = getBairrosQNamedPRX(fltrBairro);
		List<Bairro> itensCep = getBairrosQNamedCepPRX(fltrCep);
		HashSet<Bairro> itens = new HashSet<Bairro>();

		itensBairro.addAll(itensCep);
		itens.addAll(itensBairro);
		itensBairro.clear();
		itensBairro.addAll(itens);
		return itensBairro;
	}

	public List<Bairro> getBairrosByQuery(String query, Object... params) {
		return getListByQry(query, params);
	}

}
